/*
 * $Id: QENameToUIDTransformer.m 80 2009-07-05 22:34:32Z jon@bway.net $
 * Chalk
 *
 * Created 7/5/09
 * Copyright Jon Gordon
 * 
 * Permission is hereby granted, free of charge, to any person obtaining 
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including 
 * without limitation the rights to use, copy, modify, merge, publish, 
 * distribute, sublicense, and/or sell copies of the Software, and to 
 * permit persons to whom the Software is furnished to do so, subject to 
 * the following conditions:
 * 
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 * 
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#import "QENameToUIDTransformer.h"


@implementation QENameToUIDTransformer

+ (Class)transformedValueClass
{
    return [NSNumber class];
} // transformedValueClass

+ (BOOL)allowsReverseTransformation
{
    return YES;
} // allowsReverseTransformation


- (void)dealloc
{
    self.table = nil;
    
    [super dealloc];
} // dealloc


- (id)transformedValue:(id)value
{
    if ((nil == value) || (nil == table)) return nil;
    
    return [[nameIdx objectForKey:value] valueForKey:@"uid"];
} // transformedValue:

- (id)reverseTransformedValue:(id)value
{
    if ((nil == value) || (nil == table)) return nil;
    
    return [[uidIdx objectForKey:value] valueForKey:@"name"];
} // transformedValue:


- (NSSet *)table
{
    return [[table retain] autorelease];
} // table

- (void)setTable:(NSSet *)newValue
{
    if (table != newValue) {
        id tmp = table;
        table = [newValue copy];
        [tmp release];
    } // if
    
    // rebuild indexes
    if (nil != nameIdx) {
        [nameIdx release];
        nameIdx = nil;
        [uidIdx release];
        uidIdx = nil;
    } // if
    
    NSMutableDictionary *tmpNameIdx, *tmpUidIdx;
    
    if (nil != table) {
        tmpNameIdx = [NSMutableDictionary dictionaryWithCapacity:[table count]];
        tmpUidIdx = [NSMutableDictionary dictionaryWithCapacity:[table count]];
        
        for (NSDictionary *entry in table) {
            [tmpNameIdx setObject:entry forKey:[entry objectForKey:@"name"]];
            [tmpUidIdx setObject:entry forKey:[entry objectForKey:@"uid"]];
        } // for
        
        nameIdx = [[NSDictionary alloc] initWithDictionary:tmpNameIdx];
        uidIdx = [[NSDictionary alloc] initWithDictionary:tmpUidIdx];
    } // if
} // setTable
@end
